package pl.edu.pw.elka.tinyrepo.common;

import java.util.HashMap;
import java.util.Map;

/**
 * Enum dla kodu statusu. 
 * 
 * @author Piotr Jarosik
 */
public enum StatusCode {
   OK(200),
   CREATED(201),
   MOVED_PERMANENTLY(301) {
      @Override
      public String toString() {
         return "Moved permanently";
      }
   },
   BAD_REQUEST(400) {
      @Override
      public String toString() {
         return "Bad request";
      }
   },
   FORBIDDEN(403),
   NOT_FOUND(404) {
      @Override
      public String toString() {
         return "Not found";
      }
   },
   /** Gdy dany zasob juz istnieje w repozytorium. */
   CONFLICT(409),
   NOT_IMPLEMENTED(501) {
      @Override
      public String toString() {
         // TODO Auto-generated method stub
         return "Not implemented";
      }
   },
   /** Nieprawidlowa wersja protokolu. */
   NOT_SUPPORTED(505) {
      @Override
      public String toString() {
         // TODO Auto-generated method stub
         return "Not supported";
      }
   }
   ;
   
   /** Kod liczbowy dla StatusCode*/
   private final Integer code;
   
   /** Mapa przydatna zeby okreslic rodzaj enuma na podstawie stringa (kodu). 
    *   String po to zeby nie robic niepotrzebnej konwersji na Integer tylko do sprawdzenia
    *   rodzaju kodu.*/
   private static final Map<String, StatusCode> getMap = 
                                    new HashMap<String, StatusCode>();
   static {
      getMap.put("200", OK);
      getMap.put("201", CREATED);
      getMap.put("301", MOVED_PERMANENTLY);
      getMap.put("400", BAD_REQUEST);
      getMap.put("403", FORBIDDEN);
      getMap.put("404", NOT_FOUND);
      getMap.put("409", CONFLICT);
      getMap.put("501", NOT_IMPLEMENTED);
      getMap.put("505", NOT_SUPPORTED);
   }
   
   /**
    * Funkcja analogiczna do valueOf. Na podstawie stringa okresla enum.
    * (wprowadzona tylko z powodu "myslnika" w Headerach, ktorego java nie akceptuje w nazwach enumow,
    *  w przeciwnym razie mozna by bylo po prostu wywolac metode valueOf dla enuma).
    *  
    * @param stringNumber - troche dziwne ze string, ale nie trzeba przynajmniej zamieniac na inta, a kod 
    * bledu i tak mozna uzyskac bezposrednio z otrzymanego enuma
    * @return odpowiedni enum lub null jezeli taki typ nie istnieje.
    */
   public static StatusCode getType(String numberString) {
         return getMap.get(numberString);
   }
   
   private StatusCode(Integer code) {
      this.code = code;
   }
   
   /**
    * @return kod dla danego StatusCode
    */
   public Integer getCode() {
     return code; 
   }
}
